在上節中,我們介紹了 LWP::Simple 的用法和範例。使用 LWP::Simple 來抓取網頁相當方便,但是它也有一些缺點:因此,若要能夠取得要求網頁的狀態碼,就必須要使用較複雜的模組。以下的這個例子,可以先判斷是否抓取網頁成功,若成功,則印出網頁原始碼;若不成功,則印出錯誤訊息。程式碼(tstatus.pl)如下:
- 在抓取網頁過程中,無法傳會狀態碼(Status Code)。常見的狀態碼有下列幾種:
狀態碼 說明 200 OK,一切正常 404 找不到所要求的網頁 408 等待伺服器回覆時間過久 500 伺服器內部發生錯誤
- Perl 程式並不會在表頭(Header)向伺服器表明自己的身份。
- 不支援代理伺服器(Proxy Server)。
下面這個範例(tproxy.pl),則使用了 HTTP 代理伺服器來減少網路的流量:
行文至此,讀者應該可以感受到用 Perl 來抓取網頁的便利性與彈性。稍微修改上述的範例程式,就可以產生許多不同的應用,以下是一些有用(或有趣)的應用範例:
- 自動留言程式:你可以寫一個 Perl 程式,自動尋找留言版,並自動留言,如「孫悟空到此一遊」等。
- Web 統計資料:可以根據搜尋引擎的結果,來發掘對於某個問題的正反面答案。例如,如果你想知道那個程式語言最被大家喜愛,可參見:
http://www.lehigh.edu/~sol0/rules.html (不看上述網頁,你大概可以猜到答案是什麼吧?)- 驗證網頁的連結是否正確:我們只需抽取出此網頁的連結,再抓取所有連結網頁的表頭(不需抓取內文,以減輕網路流量),即可確認連結是否正確。
- 表明 User Agent 身份:在向伺服器送出的 Request 表頭中,Perl 程式碼可以表明自己的身份,此功能能讓伺服器記錄送出 request 的 UserAgent 的類別。
- 個人資訊代理程式(Agent):你可以寫一個 Perl 程式,定期自動抓取個人所需特定資訊,並即刻顯示再瀏覽器,例如某城市的氣溫、快遞包裹的傳送情況等。
- Mirror 功能:建立一個 Mirror 站台,並用 Perl 程式在預定時段自動更新。
- 網羅新聞:即時抓取線上新聞,並根據新聞標題加以自動聚題(同一個主題的新聞放在一起)與分類(政治類、娛樂類等)。這是典型的「網頁加工業」,也是「知識管理」的一部份,可見太一信通公司的網羅新聞頁:
http://www.taiyi.com - 全文搜尋引擎:你可以反覆抓取網頁,再根據資訊檢索(Information Retrieval)的各種演算法,建立反轉索引(Inverted Indexing),最後建立一個網頁的全文檢索搜尋引擎。典型的搜尋引擎可見中正大學的蓋世引擎:
http://gais.cs.ccu.edu.tw/ 或美國的 Google 搜尋引擎:http://www.google.com
Perl